package com.gehj.uhttp;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

//gson解析:
public class GsonUtils {

    /**
     * 将Json数据解析成相应的对象 ：json本身就是实体
     * @param jsonData
     * @param clazz 对应的实体类
     * @param <T>
     * @return
     */
     public static <T> T JsonToObject(String jsonData, Class<T> clazz) {
                 Gson gson = Singleton.getGsonIntance();
                 T result = gson.fromJson(jsonData, clazz);
                 return result;
             }



     /**
     * 反向 object -->json
     * @param o
     * @return
     */
    public static String  Object2Json(Object o) {
            Gson gson = Singleton.getGsonIntance();
              String json = gson.toJson(o);
              return  json;
    }

    /**
     * json 将Json解析成相应的对象集合,直接转(json本身就是数组,里面是对象)
     * @param json
     * @param clazz jsonAarry中jsonObj对应的实体
     * @param <T>
     * @return
     */
    public static <T> List<T> jsonToList(String json, final Class<T> clazz) {
        Type type = new TypeToken<ArrayList<JsonObject>>(){}.getType();
        Gson gson = Singleton.getGsonIntance();
        ArrayList<JsonObject> jsonObjects =gson.fromJson(json, type);//1,先转成数组;
        ArrayList<T> arrayList = new ArrayList<>();
        for (JsonObject jsonObject : jsonObjects) {//数组分解后一一添加;
            T t = new Gson().fromJson(jsonObject, clazz);
            arrayList.add(t);
        }
        return arrayList;
    }



/**
 * 建议解决复杂的json解析还是走原生的最方便,
 * JsonObject与JsonAarry都是gson的,
 * 用起来不如原生的方便
 * */

    /*json直接就是Array的情况*/
    public static JsonArray getJsonAarry(String json){//json本来就是一个数组,可以直接解析;
        //Json的解析类对象
        JsonParser parser = new JsonParser();
        //将JSON的String 转成一个JsonArray对象
        JsonArray jsonArray = parser.parse(json).getAsJsonArray();
        return jsonArray;
    }

    /*以下是jsonObject中含有数组jsonArray的逐步解析的步骤*/
    //步骤一:json先转成jsonobj
    public  static JsonObject getJsonObject(String json){
        return new JsonParser().parse(json).getAsJsonObject();
    }

    //步骤二:jsonobj中通过key拿到JsonArray;
    public static JsonArray getJSonAarryByKey(JsonObject jsonObject, String key) {//在解析过程通过可以拿到jsonAarry
        //再转JsonArray 加上数据头
        JsonArray jsonArray = jsonObject.getAsJsonArray(key);
        return  jsonArray;
    }

    //步骤三:jsonAarry转普通的AarryList
    public static  <T> List<T> jsonAarryToList(JsonArray jsonArray, Class<T> clazz) {
        ArrayList<T> arrayList = new ArrayList<>();
        Gson gson = Singleton.getGsonIntance();
        Type type = new TypeToken<ArrayList<JsonObject>>(){}.getType();
        ArrayList<JsonObject> jsonObjects =gson.fromJson(jsonArray, type);
        for (JsonObject jsonObject : jsonObjects) {
            T t = new Gson().fromJson(jsonObject, clazz);
            arrayList.add(t);
        }
        return arrayList;
    }







}
